package BuildCommand::LoadNewContent;

# $Id: LoadNewContent.pm 309 2010-08-07 10:37:45Z dolbanavt $
# $Date: 2010-08-07 13:38:05 +0300 (Суб, 07 Авг 2010) $
# $HeadURL: https://robosearch.googlecode.com/svn/branches/reborn/lib/BuildCommand/LoadNewContent.pm $
# $LastChangedRevision: 312 $

use parent qw( BuildCommand );
use JIP::ToolSet;
use Carp qw( croak );
use English qw( -no_match_vars );
use YAML qw( Load );
use IO::YAML;
use Filesystem::Filter;

our $VERSION = '1.0';

sub execute {
    my $self = shift;

    $self->_log_step_header('LoadNewContent');

    my @hosts = $self->get_dbh->get_hosts_for_load( $self->get_conf->ageing );

    for my $each_host ( @hosts ) {
        $self->get_log->Note( 'хост '. $each_host->get_ip_address );

        $self->get_log->Note('удаление устаревших данных')
            and $self->get_dbh->remove_files_for( $each_host->get_id );

        my $filter_fs = Filesystem::Filter->new(
            host_object => $each_host,
            scratch_dir => $self->get_conf->filter->scratch_dir,
            output_dir  => $self->get_conf->filter->output_dir,
        );

        $self->get_log->Note('загрузка контента');

        $self->get_log->Debug(
            'YAML-файл: '. $filter_fs->output_file_location()
        );

        if ( -f $filter_fs->output_file_location() ) {
            $self->get_log->Debug('файл найден. загрузка...');
        }
        else {
            $self->get_log->Warn('файл не найден. загрузка отменена.')
                and next;
        }

        $self->_load_content_from( $filter_fs->output_file_location() );

        $self->get_log->Note('апдейт статуса хоста')
            and $self->get_dbh->update_status_for( $each_host->get_id );
    }

    return 1;
}

sub _load_content_from {
    my ( $self, $path_to_file ) = @ARG;

    my $yaml_reader = IO::YAML->new(
        path => $path_to_file,
        mode => 'r',
    );

    $yaml_reader->handle->binmode(':utf8');

    while ( defined( my $yaml_item = $yaml_reader->getline() ) ) {
        my $item = Load( $yaml_item );

        if ( $item->{'type'} eq 'file' ) {
            $self->get_dbh->add_new_file( $item );
        }
        elsif ( $item->{'type'} eq 'dir' ) {
            $self->get_dbh->add_new_dir( $item );
        }
        else {
            croak 'unexpected value: '. $item->{'type'};
        }
    }

    $yaml_reader->close() or croak 'cannot close yaml stream: '. $OS_ERROR;

    return 1;
}

1;

__END__

=head1 NAME

BuildCommand::LoadNewContent - шаг билда базы данных

=head1 SYNOPSIS

    use BuildCommand::LoadNewContent;

    my $t = BuildCommand::LoadNewContent->new();

=head1 DESCRIPTION

Загружает в базу данных информацию из текстовых файлов - метаданные
которые собрал кроулер и оработал фильтр контента.

После загрузки данных в базу добавляется информация о том что для
конкретного хоста сети строилась база.

=head1 DEPENDENCIES

YAML (from CPAN)

IO::YAML (from CPAN)

JIP::ToolSet (from base_lib)

=head1 AUTHOR

Vladimir Zhavoronkov, <dolbanavt (at) Google Mail>

http://dolbanavt.livejournal.com/

=head1 LICENSE AND COPYRIGHT

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

=cut
